package io.esirong.util;


import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * Gson/json 数据处理
 */
public class JsonUtil {
    /**
     * 实例对像转换成JSON字符串
     *
     * @param object 实例对像
     * @return JSON字符串
     */
    public static String toJsonString(Object object) {
        return new Gson().toJson(object);
    }

    /**
     * JSON字符串转换成实例对像
     *
     * @param json     待转换的JSON字符串
     * @param classOfT 指定转换实例类型类名
     * @param <T>      类型
     * @return 实例对像
     */
    public static <T> T parseObject(String json, Class<T> classOfT) {
        return new Gson().fromJson(json, classOfT);
    }

    /**
     * JSON字符串转换成实例对像
     *
     * @param json 待转换的JSON字符串
     * @param type 指定转换实例类型
     * @param <T>  类型
     * @return 实例对像
     */
    public static <T> T parseObject(String json, Type type) {
        return new Gson().fromJson(json, type);
    }

    /**
     * 获取一个默认的JSON实例
     *
     * @return JSON实例
     */
    public static JsonObject getJsonObject() {
        return new JsonObject();
    }

    /**
     * JSON字符串转换成实例对像List
     *
     * @param json     待转换的JSON字符串
     * @param classOfT 指定转换实例类型类名
     * @param <T>      类型
     * @return 实例对像List
     */
    public static <T> List<T> parseList(String json, Class<T> classOfT) {
        Type type = new ParameterizedTypeImpl(classOfT);
        List<T> list = new Gson().fromJson(json, type);
        return list;
    }

    private static class ParameterizedTypeImpl implements ParameterizedType {
        Class clazz;

        public ParameterizedTypeImpl(Class clz) {
            clazz = clz;
        }

        @Override
        public Type[] getActualTypeArguments() {
            return new Type[]{clazz};
        }

        @Override
        public Type getRawType() {
            return List.class;
        }

        @Override
        public Type getOwnerType() {
            return null;
        }
    }
}
